using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;

namespace GameOverlayWPF
{
    public partial class App : Application
    {
        private MainWindow? _mainWindow = null;
        
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            
            // 初始化启动诊断
            StartupDiagnostics.Initialize();
            StartupDiagnostics.LogStep("应用启动", "OnStartup 开始");
            
            // 设置关闭模式为显式关闭，避免登录窗口关闭时应用退出
            this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
            StartupDiagnostics.LogStep("设置关闭模式", "OnExplicitShutdown");
            
            // 添加全局异常处理
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            StartupDiagnostics.LogStep("注册全局异常处理器");
            
            // 添加调试输出
            System.Diagnostics.Debug.WriteLine("App.OnStartup called");
            
            // 启动登录流程
            StartupDiagnostics.LogStep("开始登录流程");
            ShowLoginOrMainWindow();
        }
        
        private async void ShowLoginOrMainWindow()
        {
            try
            {
                System.Diagnostics.Debug.WriteLine("开始启动流程...");
                StartupDiagnostics.LogStep("ShowLoginOrMainWindow 开始");
                
                // 先显示界面，不阻塞启动流程
                // 在后台检查版本更新，避免阻塞启动
                StartupDiagnostics.LogStep("启动后台更新检查");
                _ = Task.Run(async () =>
                {
                    try
                    {
                        await CheckForUpdates();
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine($"后台检查更新失败（非致命）: {ex.Message}");
                        StartupDiagnostics.LogError("后台检查更新", ex);
                    }
                });
                
                // 检查是否已登录（从文件加载的令牌）
                StartupDiagnostics.LogStep("检查登录状态");
                bool isLoggedIn = false;
                try
                {
                    isLoggedIn = AuthService.IsLoggedIn();
                    System.Diagnostics.Debug.WriteLine($"登录状态检查: {isLoggedIn}");
                    StartupDiagnostics.LogStep("登录状态检查完成", $"已登录: {isLoggedIn}");
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine($"登录状态检查失败: {ex.Message}");
                    StartupDiagnostics.LogError("登录状态检查", ex);
                    // 如果检查登录状态失败，假设未登录
                    isLoggedIn = false;
                }
                
                if (!isLoggedIn)
                {
                    System.Diagnostics.Debug.WriteLine("未登录，显示登录窗口...");
                    StartupDiagnostics.LogStep("显示登录窗口");
                    // 显示登录窗口
                    var loginWindow = new LoginWindow();
                    var loginResult = loginWindow.ShowDialog();
                    
                    System.Diagnostics.Debug.WriteLine($"登录窗口关闭，DialogResult: {loginResult}, IsLoggedIn: {loginWindow.IsLoggedIn}");
                    StartupDiagnostics.LogStep("登录窗口关闭", $"DialogResult: {loginResult}, IsLoggedIn: {loginWindow.IsLoggedIn}");
                    
                    if (loginResult != true || !loginWindow.IsLoggedIn)
                    {
                        // 用户取消登录或登录失败，关闭应用程序
                        System.Diagnostics.Debug.WriteLine("用户取消登录或登录失败，关闭应用程序");
                        StartupDiagnostics.LogStep("用户取消登录", "应用将退出");
                        Shutdown();
                        return;
                    }
                    
                    System.Diagnostics.Debug.WriteLine("登录成功，继续启动主窗口");
                    StartupDiagnostics.LogStep("登录成功");
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("已登录，直接启动主窗口");
                    StartupDiagnostics.LogStep("跳过登录", "使用缓存的token");
                }
                
                // 登录成功，创建并显示主窗口
                System.Diagnostics.Debug.WriteLine("创建MainWindow...");
                StartupDiagnostics.LogStep("开始创建MainWindow");
                _mainWindow = new MainWindow();
                System.Diagnostics.Debug.WriteLine("显示MainWindow...");
                StartupDiagnostics.LogStep("MainWindow创建完成");
                
                // 确保主窗口正确显示
                _mainWindow.WindowState = WindowState.Normal;
                _mainWindow.Show();
                _mainWindow.Activate();
                _mainWindow.Focus();
                StartupDiagnostics.LogStep("MainWindow已显示");
                
                // 监听主窗口关闭事件
                _mainWindow.Closing += MainWindow_Closing;
                
                // 添加调试输出
                System.Diagnostics.Debug.WriteLine("MainWindow created and shown");
                StartupDiagnostics.LogSuccess();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"启动失败: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {ex.StackTrace}");
                StartupDiagnostics.LogError("应用启动失败", ex);
                MessageBox.Show($"应用程序启动失败: {ex.Message}\n\n详细信息请查看日志文件:\n{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "GameOverlayWPF", "startup_log.txt")}", "启动错误", MessageBoxButton.OK, MessageBoxImage.Error);
                Shutdown();
            }
        }
        
        private void MainWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
        {
            // 如果主窗口关闭，检查是否是退出登录
            // 如果不是退出登录，则关闭应用程序
            if (_mainWindow != null && _mainWindow.Visibility == Visibility.Visible)
            {
                // 主窗口仍然可见，说明是正常关闭，关闭应用程序
                Shutdown();
            }
        }
        
        public void ShowLoginWindow()
        {
            // 显示登录窗口（用于退出登录后重新登录）
            if (_mainWindow != null)
            {
                _mainWindow.Hide();
            }
            
            var loginWindow = new LoginWindow();
            var loginResult = loginWindow.ShowDialog();
            
            if (loginResult == true && loginWindow.IsLoggedIn)
            {
                // 重新登录成功，显示主窗口
                if (_mainWindow != null)
                {
                    _mainWindow.LoadUserInfo();
                    _mainWindow.Show();
                    _mainWindow.Activate();
                    _mainWindow.Focus();
                }
                else
                {
                    // 主窗口不存在，重新创建
                    ShowLoginOrMainWindow();
                }
            }
            else
            {
                // 取消登录或登录失败，关闭应用程序
                Shutdown();
            }
        }
        
        private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine($"未处理的UI线程异常: {e.Exception.Message}");
            System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {e.Exception.StackTrace}");
            StartupDiagnostics.LogError("UI线程未处理异常", e.Exception);
            
            MessageBox.Show($"发生未处理的错误: {e.Exception.Message}\n\n详细信息请查看日志文件", 
                "错误", MessageBoxButton.OK, MessageBoxImage.Error);
            
            // 设置为已处理，防止程序崩溃
            e.Handled = true;
        }
        
        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception? ex = e.ExceptionObject as Exception;
            if (ex != null)
            {
                System.Diagnostics.Debug.WriteLine($"未处理的应用程序域异常: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {ex.StackTrace}");
                StartupDiagnostics.LogError("应用程序域未处理异常", ex);
                
                MessageBox.Show($"发生严重错误: {ex.Message}\n\n详细信息请查看日志文件:\n{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "GameOverlayWPF", "startup_log.txt")}", 
                    "严重错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        
        /// <summary>
        /// 检查版本更新
        /// </summary>
        private async Task CheckForUpdates()
        {
            try
            {
                System.Diagnostics.Debug.WriteLine("开始检查版本更新...");
                
                // 调用更新检查服务
                var versionInfo = await VersionUpdateService.CheckForUpdates();
                
                if (versionInfo != null)
                {
                    System.Diagnostics.Debug.WriteLine($"发现新版本: {versionInfo.VersionName}");
                    
                    // 确保在UI线程显示对话框
                    await Dispatcher.InvokeAsync(() =>
                    {
                        try
                        {
                            // 显示更新对话框
                            var updateDialog = new UpdateDialog(versionInfo);
                            updateDialog.ShowDialog();
                            
                            // 如果是强制更新且用户点击了更新按钮，应用程序会在UpdateDialog中退出
                            // 如果是非强制更新，继续正常流程
                        }
                        catch (Exception dialogEx)
                        {
                            System.Diagnostics.Debug.WriteLine($"显示更新对话框失败: {dialogEx.Message}");
                        }
                    }, DispatcherPriority.Normal);
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("当前已是最新版本或检查失败");
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"检查更新时发生错误: {ex.Message}");
                // 更新检查失败不应阻止应用程序启动，只记录错误
            }
        }
    }
}